package com.hdu.xxl_job_client.utils;

import com.alibaba.fastjson2.JSONObject;
import com.hdu.xxl_job_client.annotation.JsonField;
import org.springframework.util.ReflectionUtils;


import java.lang.reflect.Field;

import static java.util.Objects.nonNull;
import static java.util.Optional.ofNullable;

public class JsonUtils {

    /**
     * 将对象转换为JSONObject。
     *
     * @param obj        要转换为JSONObject的对象。
     * @param ignoreNull 是否忽略字段值为null的字段。
     * @return 转换后的JSONObject。
     */
    public static JSONObject obj2json(Object obj, boolean ignoreNull) {
        JSONObject jsonObject = new JSONObject();
        ReflectionUtils.doWithFields(obj.getClass(), field -> {
            field.setAccessible(true);
            Object value = field.get(obj);
            if (nonNull(value) || !ignoreNull) {
                jsonObject.put(getFieldName(field), value);
            }
        });
        return jsonObject;
    }

    public static <T> T json2obj(JSONObject jsonObject, Class<T> clazz) {
        return jsonObject.to(clazz);
    }

    private static String getFieldName(Field field) {
        return ofNullable(field.getAnnotation(JsonField.class))
                .map(JsonField::value)
                .orElse(field.getName());
    }
}
